#include <mips/regdef.h>

.globl	Pop
Pop:
	subu 	sp,sp,8
	sw		$fp,4(sp)
	sw		gp,0(sp)
	move	$fp,sp

	sw		a0,8($fp)		#puntero a la base de la pila
	sw		a1,12($fp)		#tamaño de la pila
	sw		a2,16($fp)		#puntero a cantidad de elementos
	sw		a3,20($fp)		#puntero al double

#valido cant > 0, sino PopExitFail
	lw		v0,16($fp)		#cargo el puntero
	lw		v0,0(v0)		#cargo el valor al que apunta
	bgtz	v0,PopContinue
	li		v0,0			#exit_code = ERROR
	j		PopExit

#procesar
PopContinue:
	#decremento cant en 1
	addu	v0,v0,-1		#decremento
	lw		v1,16($fp)		#cargo el puntero en v1 (ya lo perdí en v0)
	sw		v0,0(v1)		#guardo el nuevo valor

	#cargo el puntero del double
	sll		v1,v0,3			#ajusto el puntero segun el tamaño de la variable
	lw		v0,8($fp)		#cargo el puntero a la base de la pila
	addu	v0,v1,v0		#me posiciono en la direccion de memoria del elemento a tomar
	l.d		$f0,0(v0)		#leo el double en f0
	lw		t3,20($fp)		#cargo el puntero al double a devolver
	s.d		$f0,0(t3)		#cargo el double en la direccion apuntada por v1

PopExitOK:
	li		v0,1			#exit_code = OK
	j		PopExit

PopExit:
	move	sp,$fp
	lw		$fp,4(sp)
	lw		gp,0(sp)
	addu	sp,sp,8
	j		ra
